# server.py
"""
MCP Calculator Server (Streamable HTTP)

该服务器提供 4 个最小教学用工具：add、sub、mul、div。
- 仅用于演示：不做鲁棒性/安全性处理（如除零、溢出、校验等）
- 传输层：Streamable HTTP，端点默认 http://127.0.0.1:8000/mcp
- 典型用法：由 host 动态获取工具列表 (list_tools) 与 inputSchema，并驱动工具调用
"""

from fastmcp import FastMCP

# 实例名会在工具发现中显示，有助于主机/学员识别
mcp = FastMCP("Calc-HTTP")

@mcp.tool
def add(a: float, b: float) -> float:
    """计算加法：返回 a + b。

    适用场景：两数相加。
    说明：教学示例，不处理特殊数值或溢出边界。

    Args:
        a (float): 加数 1。
        b (float): 加数 2。

    Returns:
        float: a 与 b 的和。

    Examples:
        >>> add(1, 2)
        3.0
        >>> add(-0.5, 0.2)
        -0.3
    """
    return a + b

@mcp.tool
def sub(a: float, b: float) -> float:
    """计算减法：返回 a - b。

    适用场景：两数相减。
    说明：教学示例，不处理特殊数值或溢出边界。

    Args:
        a (float): 被减数。
        b (float): 减数。

    Returns:
        float: a 减去 b 的差。

    Examples:
        >>> sub(5, 2)
        3.0
        >>> sub(1.5, 3)
        -1.5
    """
    return a - b

@mcp.tool
def mul(a: float, b: float) -> float:
    """计算乘法：返回 a * b。

    适用场景：两数相乘。
    说明：教学示例，不处理特殊数值或溢出边界。

    Args:
        a (float): 因数 1。
        b (float): 因数 2。

    Returns:
        float: a 与 b 的积。

    Examples:
        >>> mul(2, 3)
        6.0
        >>> mul(-1.2, 0.5)
        -0.6
    """
    return a * b

@mcp.tool
def div(a: float, b: float) -> float:
    """计算除法：返回 a / b。

    适用场景：两数相除。
    说明：教学示例，**未做除零保护**；请在教学中强调此限制。

    Args:
        a (float): 被除数。
        b (float): 除数（示例未做 b=0 的保护）。

    Returns:
        float: a 除以 b 的商。

    Examples:
        >>> div(6, 2)
        3.0
        >>> div(1.5, 0.5)
        3.0
    """
    return a / b

if __name__ == "__main__":
    # 以 Streamable HTTP 方式启动；默认端点 /mcp
    mcp.run(transport="http", host="127.0.0.1", port=8000)
